const http = require('http')
const path = require('path')
const fs = require('fs')
const mime = require('mime')//根据文件后缀，返回对应的Content-Type
const checksum = require('checksum')//对文件加密，生成文件指纹


const server = http.createServer((req, res) => {
    //拿到要返回的文件的绝对路径
    let filePath = path.resolve(__dirname, path.join('www', req.url))
    //判断访问的文件是否存在
    if (fs.existsSync(filePath)) {
        const stat = fs.statSync(filePath)//获取文件详情
        if (stat.isDirectory()) {//如果访问的地址是目录文件夹
            filePath = path.resolve(filePath, 'index.html')
        }
        if (fs.existsSync(filePath)) {//再次判断访问的文件是否存在
            const { ext } = path.parse(filePath)//获取文件的后缀名
            const stat=fs.statSync(filePath)

            //使用Last-Modified和If-Modified-Since
            // const timeStamp = req.headers['if-modified-since']
            // //获取前端请求头中的'if-modified-since'字段
            // let status = 200
            // if (timeStamp && Number(timeStamp) === stat.mtimeMs) {
            //     //如果前端请求头中的'if-modified-since'字段与文件的最后修改时间相同，
            //     // 说明文件未被修改，直接返回304状态码，告诉前端资源未被修改，浏览器会直接从缓存中获取资源
            //     status = 304//迫使浏览器从缓存中获取资源
            // }
            // res.writeHead(status, {
            //     'Content-Type': mime.getType(ext),
            //     'Cache-Control': 'max-age=86400',//缓存时间，单位是秒
            //     //缓存到浏览器的Application中的 Cache Storage
            //     'last-modified':stat.mtimeMs,//文件最后修改时间,告诉前端图片更新了，
            //     // 前端再次请求时，会在请求头中添加'if-modified-since':stat.mtimeMs,
            // })
            // if (status === 200) {
            //     //一次性将文件全部读完
            //     // const content=fs.readFileSync(filePath)
            //     const fileStream = fs.createReadStream(filePath)//不是一次性读取，而是流式读取，每次读取一部分，然后返回给前端
            //     fileStream.pipe(res)
            // } else {//如果状态码是304，说明文件未被修改，什么都不返回
            //     res.end()
            // }



            //使用ETag和If-None-Match
            checksum.file(filePath, (err, sum) => {
                const resStream = fs.createReadStream(filePath)
                sum = `"${sum}"`
                if (req.headers['if-none-match'] === sum) {
                    res.writeHead(304, {
                        'Content-Type': mime.getType(ext),
                        'Cache-Control': 'max-age=86400',
                        'etag': sum
                    })
                    res.end()
                } else {
                    res.writeHead(200, {
                        'Content-Type': mime.getType(ext),
                        'Cache-Control': 'max-age=86400',
                        'etag': sum
                    })
                    resStream.pipe(res)
                }
            })
        }
    } else {
        res.writeHead(404, { 'Content-Type': 'text/html;charset=utf-8' })
        res.end('<h1>404 not found</h1>')
    }

})
server.listen(3000, () => {
    console.log('server is running at http://localhost:3000')
})

